iT邦幫忙

2025 iThome 鐵人賽

DAY 19
0
Software Development

軟體開發養成計畫:以小程式實作深化開發能力系列 第 19

[Day19]從初級到進階!解鎖 Factory與 Observer模式

  • 分享至 

  • xImage
  •  

開場

歡迎各位來到的設計模式進階篇。
延續了我們第十一天分享的 Singleton 與 MVC 入門設計模式,今天想進一步挑戰自己,學習 Factory(工廠模式)與 Observer(觀察者模式),看看如何在 Python 小程式中實際應用,讓寫出的程式更富有彈性與擴充性。

如果你曾經歷過以下痛苦:

  • 明明只改了一個小功能,卻得跑去改十幾個檔案。
  • 專案不斷擴大,新的功能像補丁一樣,越疊越難維護。

那麼,今天的兩個模式就是為你準備的「程式碼解藥」!我們將學習的 Factory(工廠模式)和 Observer(觀察者模式)核心目標只有一個:讓程式碼達成軟體設計的最高標準——高內聚、低耦合。

今天就讓我們一起,讓程式碼從「一團亂麻」進化成「優雅的自動化系統」吧!

正文開始:解鎖兩大神器

模式一:Factory Pattern工廠模式

Factory 模式屬於創建型模式,簡單來說,它把「製造」東西的職責,從需要這些東西的人(客戶端程式碼)身上剝離出來,交給一個專業的「工廠」,會讓程式碼更專心於業務上。

它的關鍵優勢在於:它把具體產品的 new ConcreteClass() 邏輯封裝起來。也就是說當我們需要新增或修改產品時,只需要動 Factory 內部,所有呼叫 Factory 的客戶端程式碼都不用修改。
這就是我們追求的Decoupling解耦

簡單 Python 範例:

(1)定義類別

class Dog:
    def speak(self):
        return "Woof!"

class Cat:
    def speak(self):
        return "Meow!"
  • Dog 和 Cat 都有一個 speak 方法,分別會回傳 "Woof!" 和 "Meow!"。

(2)工廠函式

def animal_factory(animal_type):
    if animal_type == "dog":
        return Dog()
    elif animal_type == "cat":
        return Cat()
  • animal_factory 是個工廠函式,根據傳入的 animal_type 字串決定要建立 Dog 還是 Cat 的實例,然後回傳這個物件。

(3)使用工廠建立物件

pet = animal_factory("dog")
print(pet.speak()) 
  • 呼叫 animal_factory("dog") → 產生 Dog 物件並指派給 pet。
  • 呼叫 pet.speak() → 執行 Dog 的 speak 方法,印出 "Woof!"。

優點表格:

元素 概念 / 職責 優點
產品介面 (Product) 定義所有產品的共同行為 提供統一接口,使用者不需了解實作細節
具體產品 (Concrete Product) 實體的產品類別 容易擴充新產品類型,只需新增類別
工廠 (Factory) 根據輸入參數,決定並創建對應的具體產品 封裝物件創建邏輯,程式碼更整潔;使用者只需指定類型,不需知道內部建構細節

模式二:Observer Pattern觀察者模式

Observer 模式屬於行為型模式。它定義了一種「一對多」的依賴關係,讓一個對象(主題)狀態改變時,所有依賴它的對象(觀察者)都能自動被通知並更新。
它的關鍵優勢在於:能將發布者與訂閱者徹底分離,實現極致的鬆散耦合。也就是說主題完全不需要知道誰在觀察它,或觀察者要做什麼。它只管發送通知。這讓你的程式碼可以輕鬆建立出「當 A 事件發生時,B、C、D 模組自動響應」的優雅事件驅動機制。常見於 UI 事件處理、數據流更新等場景。

簡單 Python 範例:

(1)Subject 類別(被觀察者)

class Subject:
    def __init__(self):
        self.observers = []
  • Subject 有一個 observers 清單,用來存放所有觀察者(Observer)物件。
def attach(self, observer):
    self.observers.append(observer)
  • attach 方法用來把觀察者加入清單。
def notify(self, message):
    for observer in self.observers:
        observer.update(message)
  • notify 方法用來通知所有觀察者,把訊息傳給他們的 update 方法。
    (2)Observer 類別(觀察者)
class Observer:
    def update(self, message):
        print(f"Received message: {message}")
  • Observer 只要有 update 方法,收到訊息就會印出來。
    (3)實際使用
subject = Subject()
obs1 = Observer()
obs2 = Observer()

subject.attach(obs1)
subject.attach(obs2)
subject.notify("Hello Observers!")
  • 建立一個 Subject(被觀察者)和兩個 Observer
  • 用 attach 把觀察者加入被觀察者的清單
  • 呼叫 notify("Hello Observers!") → 所有觀察者的 update 都會被呼叫,印出:
Received message: Hello Observers!
Received message: Hello Observers!

優點表格

元素 概念 / 職責 優點
被觀察者 (Subject) 保存觀察者清單,狀態改變時通知所有觀察者 物件之間低耦合,支援多個觀察者同時接收更新
觀察者 (Observer) 定義接收通知的方法(如 update) 可以獨立修改,增加或移除觀察者不影響被觀察者
通知機制 (Notify) 當被觀察者狀態改變時,呼叫所有觀察者的 update 方法 適合事件驅動或即時通知場景,方便擴充和維護

我很喜歡這句話:"設計模式的價值,在於讓現在的你,寫出未來更容易維護的程式碼。"在實作的過程中,雖然腦袋偶爾像打結的線,但當整個架構慢慢成形,那份清晰與秩序感,讓我心裡充滿了踏實的溫暖。
祝福我們都能繼續在IT鐵人賽學習的路上越走越遠~


上一篇
[Day18]程式 x 學習:用 Python 做一個單字測驗器
下一篇
[ Day 20 ] 寫程式也能當鬧鐘?Python 記事提醒小實作
系列文
軟體開發養成計畫:以小程式實作深化開發能力20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言